/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fachada;

import exceptions.AtributoNaoPreenchidoException;
import exceptions.EventoInexistenteException;
import exceptions.LoginInvalidoException;
import exceptions.SenhaInvalidaException;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import agenda.SistemaAgenda;

/**
 *
 * @author Paulo de Tarso e Jefferson Ricardo
 */
public class Fachada {

    
    /**
     * Agenda responsável pela manipulação do sistema.
     */
    private SistemaAgenda agenda = new SistemaAgenda();

    /**
     * Método que inicia o sistema com os dados gravados no arquivo.
     */
    public void iniciaSistema() throws IOException, ClassNotFoundException{
        this.agenda.iniciaSistema();
    }

    /**
     * Método que cria um usuário na agenda.
     */
    public void criarUsuario(String login, String senha, String nome) throws SenhaInvalidaException, LoginInvalidoException{
        this.agenda.criarUsuario(login, senha, nome);
    }

    /**
     * Método que retorna o nome do usuário contido na agenda.
     */
    public String getNomeUsuario(String login) throws LoginInvalidoException{
        return this.agenda.getNomeUsuario(login);
    }

    /**
     * Método que verifica se um usuário está contido na agenda.
     */
    public boolean contemUsuario(String login){
        return this.agenda.contemUsuario(login);
    }

    /**
     * Método que retorna a descrição do usuário contido na agenda.
     */
    public String getDescricao(String login, String senha) throws AtributoNaoPreenchidoException, LoginInvalidoException{
        return this.agenda.getDescricao(login, senha);
    }

    /**
     * Método que retorna o estado civil do usuário contido na agenda.
     */
    public String getEstadoCivil(String login, String senha) throws AtributoNaoPreenchidoException, LoginInvalidoException{
        return this.agenda.getEstadoCivil(login, senha);
    }

    /**
     * Método que retorna o aniversário do usuário contido na agenda.
     */
    public String getAniversario(String login, String senha) throws AtributoNaoPreenchidoException, LoginInvalidoException{
        return this.agenda.getAniversario(login, senha);
    }

    /**
     * Método que retorna a cidade natal do usuário contido na agenda.
     */
    public String getCidadeNatal(String login, String senha) throws AtributoNaoPreenchidoException, LoginInvalidoException{
        return this.agenda.getCidadeNatal(login, senha);
    }

    /**
     * Método que edita a descrição do usuário contido na agenda.
     */
    public void editarDescricao(String login, String senha, String descricao) throws SenhaInvalidaException{
        this.agenda.editarDescricao(login, senha, descricao);
    }

    /**
     * Método que edita o estado civil do usuário contido na agenda.
     */
    public void editarEstadoCivil(String login, String senha, String estado) throws SenhaInvalidaException{
        this.agenda.editarEstadocivil(login, senha, estado);
    }

    /**
     * Método que edita o aniversário do usuário contido na agenda.
     */
    public void editarAniversario(String login, String senha, Date data) throws SenhaInvalidaException{
        this.agenda.editarAniversario(login, senha, data);
    }

    /**
     * Método que edita a cidade natal do usuário contido na agenda.
     */
    public void editarCidadeNatal(String login, String senha, String cidade) throws SenhaInvalidaException{
        this.agenda.editarCidadeNatal(login, senha, cidade);
    }

    /**
     * Método que cria uma relação de amizade entre dois usuários contidos na agenda.
     */
    public void adicionarAmigo(String id, String amigo) throws LoginInvalidoException{
        this.agenda.adicionarAmigo(id, amigo);
    }

    /**
     * Método que verifica se existe uma relação de amizade entre dois usuários contidos na agenda.
     */
    public boolean ehAmigo(String login, String amigo){
        return this.agenda.ehAmigo(login, amigo);
    }

    /**
     * Método que retorna uma String contendo os amigos do usuário contido na agenda.
     */
    public String getAmigos(String login) throws LoginInvalidoException{
        return this.agenda.getAmigos(login);
    }

    /**
     * Método que cria um evento determinado pelo usuário.
     */
    public Integer criarEvento(String dono, String titulo, String data, String local) throws ParseException{
        return this.agenda.criarEvento(dono, titulo, data, local);
    }

    /**
     * Método que verifica se um evento existe na agenda.
     */
    public boolean contemEvento(Integer id){
        return this.agenda.contemEvento(id);
    }

    /**
     * Método que remover um evento do sistema.
     */
    public void removerEvento(Integer evento, String dono) throws EventoInexistenteException, LoginInvalidoException{
        this.agenda.removerEvento(evento, dono);
    }

    /**
     * Método que retorna uma String contendo a data do evento criado pelo usuário.
     */
    public String getDataEvento(Integer id) throws EventoInexistenteException{
        return this.agenda.getDataEvento(id);
    }

    /**
     * Método que retorna uma String contendo o título do evento criado pelo usuário.
     */
    public String getTituloEvento(Integer id) throws EventoInexistenteException{
        return this.agenda.getTituloEvento(id);
    }

    /**
     * Método que retorna uma String contendo o local do evento criado pelo usuário.
     */
    public String getLocalEvento(Integer id) throws EventoInexistenteException{
        return this.agenda.getLocalEvento(id);
    }

    /**
     * Método que retorna uma String contendo o dono do evento.
     */
    public String getDonoEvento(Integer id){
        return this.agenda.getDonoEvento(id);
    }

    /**
     * Método que adiciona um participante(usuário) a um evento criado pelo usuário.
     */
    public void adicionarParticipante(String usuarioAdicionador, Integer evento, String participante) throws LoginInvalidoException{
        this.agenda.adicionarParticipante(usuarioAdicionador, evento, participante);
    }

    /**
     * Método que verifica se o usuário é dono de um evento.
     */
    public boolean ehDono(String id, Integer evento){
        return this.agenda.ehDono(id, evento);
    }

    /**
     * Método que retorna uma lista de "participantes" contidas no evento criado pelo usuário.
     */
    public String getParticipantesEvento(Integer id){
        return this.agenda.getParticipantesEvento(id);
    }

    /**
     * Método que retorna uma lista de "eventos" que o usuário é dono.
     */
    public String getEventosUsuarioEhDono(String id){
        return this.agenda.getEventosUsuarioEhDono(id);
    }

    /**
     * Método que retorna uma lista de "eventos" que o usuário participa.
     */
    public String getEventosUsuarioParticipa(String id){
        return this.agenda.getEventosUsuarioParticipa(id);
    }

    /**
     * Método que persiste os dados dos usuários contidos na agenda.
     */
    public void encerraSistema() throws IOException, ClassNotFoundException{
        this.agenda.encerraSistema();
    }

    /**
     * Método que apaga(limpa) dos usuários contidos na agenda.
     */
    public void limpaSistema(){
        this.agenda.limpaSistema();
    }

}
